﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using log4net;
using Iudicium.Parametros;
using Iudicium.Parametros.CRN;

/// <summary>
/// Descripción breve de TipoContactoCRN
/// </summary>
namespace Iudicium.Parametros.CRN
{
    public class TipoContactoCRN
    {
        private static readonly ILog log = LogManager.GetLogger("LogFile");

        public TipoContactoCRN()
        {
            //
            // TODO: Agregar aquí la lógica del constructor
            //
        }

        public static int InsertTipoContacto(TipoContacto objTipoContacto)
        {
            if (objTipoContacto == null)
            {
                throw new ArgumentException("El TipoContacto no puede ser nulo.");
            }

            if (string.IsNullOrEmpty(objTipoContacto.Descripcion))
            {
                throw new ArgumentException("La descripcion del tipo contacto no puede ser nulo o vacio");
            }

            int? tipoContactoId = 0;

            TipoContactoDSTableAdapters.TipoContactoTableAdapter adpater =
                new TipoContactoDSTableAdapters.TipoContactoTableAdapter();

            adpater.Insert(ref tipoContactoId, objTipoContacto.Descripcion);

            if (tipoContactoId == null)
            {
                throw new Exception("La sentencia SQL se ejecuto correctamente pero no se genero la llave primaria");
            }

            return tipoContactoId.Value;
        }

        public static void UpdateTipoContacto(TipoContacto objTipoContacto)
        {
            if (objTipoContacto == null)
            {
                throw new ArgumentException("El TipoContacto no puede ser nulo.");
            }
            if (objTipoContacto.TipoContactoId <= 0)
            {
                throw new ArgumentException("TipoContactoId no puede ser menor o igual que cero.");
            }
            if (string.IsNullOrEmpty(objTipoContacto.Descripcion))
            {
                throw new ArgumentException("La descripcion del tipo contacto no puede ser nulo o vacio");
            }
            TipoContactoDSTableAdapters.TipoContactoTableAdapter adpater =
                   new TipoContactoDSTableAdapters.TipoContactoTableAdapter();

            adpater.Update(objTipoContacto.TipoContactoId, objTipoContacto.Descripcion);

        }

        public static void DeleteTipoContacto(int TipoContactoId)
        {
            if (TipoContactoId <= 0)
            {
                throw new ArgumentException("TipoContactoId no puede ser menor o igual que cero.");
            }
            TipoContactoDSTableAdapters.TipoContactoTableAdapter adpater =
                  new TipoContactoDSTableAdapters.TipoContactoTableAdapter();

            adpater.Delete(TipoContactoId);

        }

        public static TipoContacto GetTipoContactoById(int TipoContactoId)
        {
            if (TipoContactoId <= 0)
            {
                throw new ArgumentException("tipoContactoId no puede ser menor o igual que cero.");
            }

            TipoContactoDSTableAdapters.TipoContactoTableAdapter adpater =
                new TipoContactoDSTableAdapters.TipoContactoTableAdapter();

            TipoContactoDS.TipoContactoDataTable tabla =
                adpater.GetTipoContactoById(TipoContactoId);

            if (tabla == null || tabla.Rows.Count == 0)
            {
                throw new Exception("No se pudo obtener el tipocontacto " + TipoContactoId + " de la base de datos");
            }
            return ConstruirTipoContacto(tabla[0]);
        }

        public static List<TipoContacto> GetTipoContactoBySearch(string parametro)
        {
            List<TipoContacto> lista = new List<TipoContacto>();

            TipoContactoDSTableAdapters.TipoContactoTableAdapter adpater =
                  new TipoContactoDSTableAdapters.TipoContactoTableAdapter();

            TipoContactoDS.TipoContactoDataTable tabla =
                adpater.GetTipoContactoBySearch(parametro);

            if (tabla == null)
            {
                throw new Exception("No se pudo obtener resultados de la busqueda con el parametro " +
                    parametro +
                    " de la base de datos");
            }

            foreach (TipoContactoDS.TipoContactoRow row in tabla)
            {
                TipoContacto obj = ConstruirTipoContacto(row);
                if (obj != null)
                    lista.Add(obj);
            }
            return lista;
        }

        public static TipoContacto ConstruirTipoContacto(TipoContactoDS.TipoContactoRow row)
        {
            if (row == null)
                return null;
            return new TipoContacto(row.tipoContactoId, row.descripcion);
        
        }
    }
}
